const express = require('express');
// const { setEncode, contrast } = require('../util/encode')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const User = require('../model/User')
const { secret } = require('../config/key')
const router = express.Router()

// 加密加盐,为了让密码加密更加混乱
// const salt = 'daskjfbkjhasbhjf'

//token的加密规则
// const secret = 'register-rule'

//验证身份中间件
const isAdmin = async (req, res, next) => {
    // 1.获取token
    // const token = req.headers.authorization.split(' ')[1]
    // const id = token.split('.')[0]
    // const username = token.split('.')[1]
    // console.log(id,username)

    //jwt-token, 将拿到的token进行解析获得id和username
    const token = req.headers.authorization.split(' ').pop()
    console.log(jwt.verify(token,secret))
    const { _id,username } = jwt.verify(token,secret)

    // 2.判断id是否正确，查询用户是否存在
    const user = await User.findById(_id)
    if (!user){
        return res.status(422).send('用户错误')
    }
    // 3查看username
    if(username !== user.username) {
        res.status(422).send('用户错误')
    }else {
        if (user.isAdmin === '0') {
            res.status(409).send('没有权限')
        }else if(user.isAdmin === '1') {
            // res.send('Admin')
            // 如果是管理员则跳到下一条路由，也就是下面的获取用户列表
            next()
        }
    }
}

//获取用户列表：/user
router.get('/', isAdmin, async(req, res) => {
    const list = await User.find()
    res.send(list)
})

//注册：/user/register
router.post('/register', async (req, res) => {
    // 查询用户名是否存在，如果存在不允许注册
    const user = await User.findOne({username: req.body.username})
    if(user){
        return res.status(409).send('该用户已存在！')
    }
    // 对密码进行加密处理
    // req.body.password = setEncode(req.body.password)
    // 如果注册用户不存在，则将注册信息保存到数据库中
    const newUser = await new User(req.body).save()
    res.send(newUser)
})

//登录： /user/login
router.post('/login', async (req, res) => {
    // 1.查询用户是否存在
    const user = await User.findOne({username: req.body.username})
    if(!user){
        return res.status(422).send('该用户不存在')
    }
    // else {
    //     // 2.如果用户存在，判断密码
    //     if (req.body.password !== user.password) {
    //         return res.status(422).send('密码错误')
    //     }else {
    //         res.send('token')
    //     }
    // }

    // 对密码进行解密处理对比，返回一个布尔值
    // let isPassword = contrast(req.body.password, user.password, salt)

    //如果登录用户存在，则校验密码是否正确
    let  isPassword = await bcrypt.compareSync(req.body.password, user.password)
    if (!isPassword) {
        return res.status(422).send('密码错误')
    }
    // res.send(user)
    // 登录成功返回token
    // const token = user._id + '.' + req.body.username
    const { _id, username } = user
    //参数一是传值规则,参数二是加密规则,参数三是定义token的存在时间
    const token = jwt.sign({_id,username},secret,{expiresIn:'24h'})
    res.send(token)
})

// 验证
router.get('/verify', async (req,res) => {
    console.log(req.headers.authorization)
    // // 1.获取token
    // const token = req.headers.authorization.split(' ')[1]
    // const id = token.split('.')[0]
    // const username = token.split('.')[1]
    // console.log(id,username)
    // // 2.查询用户是否存在
    // const user = User.findById(id)
    // if (!user){
    //     return res.status(422).send('用户错误')
    // }
    // // 3查看username
    // if(username !== user.username) {
    //     res.status(422).send('用户错误')
    // }else {
    //     if (user.isAdmin === '0') {
    //         res.status(409).send('没有权限')
    //     }else if(user.isAdmin == 1) {
    //         res.send('Admin')
    //     }
    // }
    const token = req.headers.authorization.split(' ').pop()
    console.log(jwt.verify(token,secret))
    const { _id } = jwt.verify(token,secret)
    console.log(_id)
} )



module.exports = router
